# 这是一行注释 相当于Java中的 //
"""相当于Java中的/* */
一般用于文档注释 相当于Java中的 /**
                            *
                            *
                            */
这是多行注释
这是多行注释
这是多行注释
"""
'''
这也是多行注释
这也是多行注释
这也是多行注释
'''

# Python基础语法

# 变量
# 命名规则：只能是数字、字母、下划线，不能以数字开头，不能是关键字（保留字）
# 查看Python中的关键字
import keyword

print(keyword.kwlist)

# 赋值
# 变量在定义的时候就需要赋值
# 定义即赋值
i = 10
j = 12
k = 20
# 可以同时给多个变量一起赋值
i, j = 40, 41  # 对于之前定义过的变量 可以重复定义，默认后面的值会覆盖前面的
# print函数在打印的时候可以传入n个变量 一起打印
print(i, j, k)  # 直接打印三个变量 40 41 20
print(i, j, k, end="=")  # end 指定换行符 40 41 20=
print(i, j, k, sep="|")  # sep 指定分隔符 40|41|20

# type 函数 返回变量的类型
print(type(i))

# 基本数据类型
# 五大基本数据类型：整型int、浮点型float、字符串str（没有字符char）、布尔bool、空类型NoneType

# 整型int
int1 = 1
print(int1, type(int1))

# 浮点型float
float1 = 1.0
print(float1, type(float1))

# 字符串str
# Python中也不严格区分 单双引号
str1 = ' abc \n\t\r'
str2 = "bcd"
str3 = 'c'  # Python 中不区分字符/字符串 统一都是字符串
print(str1, type(str1))
print(str2, type(str2))
print(str3, type(str3))

# 常用的方法
# 字符串是不可变的 调用的所有的方法都不会改变原有的字符串
# 看起来好像是改变了 但实际上是返回了一个新的字符串
print(str1)
print(str1.strip())  # 去除字符串两边的隐藏字符
print(str1)

print("java,scala,python".split(","))  # 按照指定的分隔符进行切分 会返回一个 "list"列表
print(str2[1])
print(str2[-1])  # 负的索引 表示从右往左数
print(str2[1] + str2[2])
print(str2[1:3])  # 切片
print(str2[::-1])  # 反转

# 格式化字符串
# 按照一定的格式输出字符串
# 9 9 乘法表 ： ? * ? = ?
# 3 * 2 = 6
a = 3
b = 2
print(str(a) + " * " + str(b) + " = " + str(a * b))
# 定义好一个字符串模板
str_format = "{} * {} = {}"
print(str_format.format(a, b, a * b))
# 另一种方式
# %d 整型
# %s 字符串
# %f 小数
# %.3f 3位小数
str_format2 = "%d * %d = %d"
print(str_format2 % (a, b, a * b))
f1 = 1.234567
print(f1)
print("小数：%f" % f1)
print("3位小数：%.3f" % f1)

# 布尔bool
# 首字母大写 True False
# 一般用于 条件表达式
bool1 = True
bool2 = False
print(bool1, type(bool1))
print(bool2, type(bool2))

# 空类型 NoneType
n = None
print(n, type(None))

# 9 9 乘法表
# 一行代码
#
# print("\n".join(["\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))

print("*" * 50)

# 类型的转换
# 想转成什么类型，就找到对应类型的方法：int() float() str() bool()
str1 = '123'
print(str1, type(str1))
str2int = int(str1)
print(str2int, type(str2int))
str2float = float(str1)
print(str2float, type(str2float))
str2int2str = str(str2int)
print(str2int2str, type(str2int2str))

# int('abc') # 注意 传入的值 是否符合要求

# to bool
# 字符串转bool：除空字符串以外都是True
# 数值型转bool：除零以外都是True
print(bool("abc"))  # True
print(bool("True"))  # True
print(bool("False"))  # True
print(bool(""))  # False
print(bool(100))  # True
print(bool(1))  # True
print(bool(0))  # False
print(bool(-0))  # False
print(bool(-1))  # True
print(bool(0.0))  # False
print(bool(1.11))  # True
print(bool(-1.11))  # True

# 算术运算符
# + - * / % ** //
# 定义变量的时候是可以指定类型的 但它的作用仅限于让Pycharm提示它拥有的属性及方法
# 就算左右两边类型不一致 运行不会报错
# a: str = 10
a = 10
b = 4
print(a + b)  # 14
print(a - b)  # 6
print(a * b)  # 40
print(a / b)  # 2.5
print(a % b)  # 2
print(a ** b)  # a 的 b次方 10000
print(10 // 3)  # a 除以 b 结果向下取整

print(2 ** 3 ** 2)  # 从右往左算 2的9次方
print(10 // 3 // 2)  # 从左往右算

# 逻辑运算符
bool1 = True
bool2 = False
print(bool1 & bool2)
print(bool1 and bool2)
print(bool1 | bool2)
print(bool1 or bool2)
print(not bool1)
print(bool1 ^ bool2)

# 选择结构
# Python中通过缩进的方式区分代码块
'''
if 表达式1:
四个空格 表达式1成立就会执行
四个空格 表达式1成立就会执行
四个空格 表达式1成立就会执行
elif 表达式2:
四个空格 表达式2成立就会执行
四个空格 表达式2成立就会执行
elif 表达式3:
四个空格 表达式3成立就会执行
四个空格 表达式3成立就会执行
else:
四个空格 表达式1、2、3都不成立就会执行
'''

# age = int(input("请输入一个年龄:"))
age = 20
# 判断是否成年
if age < 0 or age > 200:
    print("年龄不符合规范")
elif age < 18:
    print("未成年")
else:
    print("成年")

# 循环结构
'''
while 表达式1:
    循环体
    循环体
    循环体
    循环体
'''
# 计算1~100的和
i = 1
sum = 0
while i <= 100:
    sum += i
    i += 1  # 没有 ++ --
print(sum)

# for循环
# 相当于scala中的for 相当于java中的for each
# 一般用于遍历 数据容器
# range(start,stop,step) 函数
# 起始位置,结束位置,步长
# 左闭右开 步长默认是1
# 生成 1~100的序列
for i in range(1, 101):
    print(i)
